// Biblotecas estandar
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "common.h"
// Bibliotecas de IPCs y System Calls
#include <unistd.h>



/* Definición de variables estáticas para pasar argumentos a los procesos */
static char param1[16];
static char param2[16];
static long idPersona = 0;
static char buffer[255];

/* Declaración de Funciones */
int procesarArgumentos(int argc, char * argv[], int *cantidadPersonas);
void init_IPCs(void);
void crearPersonas(int cantidadPersonas);



int main(int argc, char* argv[])
{
	int cantidadPersonas = 0;
		
	if (procesarArgumentos(argc, argv, &cantidadPersonas)) {
		exit(1);
	}
	
	// Inicializo el entorno
	srand(getpid());
	init_IPCs();

	crearPersonas(cantidadPersonas);
	return 0;
}

int procesarArgumentos(int argc, char * argv[], int *cantidadPersonas) {
	char buffer[100];

	if (argc != 2)
	{
		sprintf(buffer, "Error: Cantidad de argumentos pasados al programa incorrectos\n");
		strcat(buffer, "Uso: ./launcher [CANT_PERSONAS_A_ENTRAR]\n");
		write(fileno(stdout), buffer, strlen(buffer));
		return 1;
	}
	
	sscanf(argv[1], "%d", cantidadPersonas); 
	if (*cantidadPersonas < 1)
	{
		sprintf(buffer, "Error: La cantidad de puertas debe ser un número mayor o igual a 1");
		write(fileno(stdout), buffer, strlen(buffer));
		return 2;
	}
	
	return 0;
}


void init_IPCs() {
	// Las personas no inicializan ningún IPC en la fase concurrente. Los IPCs
	// son creados por los objetos del sistema (Puerta y Camión en este caso)
}

void crearPersonas(int cantidadPersonas) {
	pid_t pid;

	while(cantidadPersonas != 0) {
		// Creo indefinidamente personas. El proceso Terminator 
		// será el encargado de terminar estos procesos
		idPersona++;
		if ((pid = fork()) < 0) {
			sprintf(buffer, "Launcher Error: %s\n", strerror(errno));
			write(fileno(stdout), buffer, strlen(buffer));
		}
		else if (pid == 0) {
			// Paso como parámetro a Persona el nombre del programa y la 
			// cantidad de puertas del museo
			sprintf(param1, "%d", CANT_DOORS); 
			sprintf(param2, "%ld", idPersona); 
			execlp("./persona", "persona", param1, param2, (char*) 0);
			sprintf(buffer, "Launcher Error: %s\n", strerror(errno));
			write(fileno(stdout), buffer, strlen(buffer));
		}
		else {
			usleep(500 * 1000);
			cantidadPersonas--;
		}
	} 
}
